import axios from 'axios'
import store from '@/store/index'
import router from '../router'
import { Message } from 'element-ui'
import tools from '@/utils'
import { md5, encryptPublic, decryptPrivate, createAesKey, aesEncrypt, aesDecrypt } from '@/secret/secret'

const request = axios.create({
  baseURL: process.env.VUE_APP_BASE_URL,
  responseType: 'arraybuffer',
  // timeout: 2000,
  withCredentials: true // 带上cookie
})

// 请求拦截器
request.interceptors.request.use((config) => {
  // console.log(config.responseType)
  config.headers['Content-Type'] = 'application/json'
  if (config.url === '/app/upload/app' || config.url === '/app/upload/app' || config.url === '/normal/update/avatar') {
    config.responseType = ''
  }
  if (config.data && config.url !== '/app/upload/app' && config.url !== '/normal/update/avatar') {
    // config.responseType = 'arraybuffer'
    // 使用md5对body需要传输的数据生成摘要
    const abstract = md5(JSON.stringify(config.data))
    // 使用RSA公钥对生成的摘要进行加密
    // 将加密后的摘要进行base64编码放入请求头
    const Signature = encryptPublic(abstract)
    config.headers.Signature = Signature
    // 动态生成AES密钥
    const aesKey = createAesKey()
    // 使用AES密钥对需要传输的json数据加密，并将加密好的数据放入body
    config.data = JSON.stringify(config.data)

    const aesSecretContent = aesEncrypt(config.data, aesKey)
    // // console.log(aesSecretContent)
    config.data = aesSecretContent
    // 使用RSA公钥对生成AES密钥进行加密
    // 将加密后的AES密钥进行base64编码放入请求头
    const rsaSecretKey = encryptPublic(aesKey)
    config.headers.SecurityKey = rsaSecretKey
  }
  if (store.getters.token) {
    config.headers.hefu = store.getters.token
  }
  config.headers.Timestamp = Math.floor(+new Date() / 1000) + ''
  return config
}, (error) => {
  return Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(res => {
  if (res.config.url === '/file/download' || res.config.url === '/app/upload/app' || res.config.url.indexOf('export') !== -1 || res.config.url.indexOf('download') !== -1 || res.config.url === '/normal/update/avatar' || res.config.url === '/normal/avatar/download' || res.config.url === '/user/down' || res.config.url === '/advise/down') { // 下载不用解密
  } else {
    res.config.responseType = 'arraybuffer'
    // 将SecurityKey使用RSA私钥进行解密得到AES密钥
    const aesKey = decryptPrivate(res.headers.securitykey)
    // 取body数据进行AES解密
    let response = aesDecrypt(res.data, aesKey)
    res.data = JSON.parse(response)
    // 使用md5对解密后body中的数据生成摘要
    response = md5(JSON.stringify(response))

    // // console.log(res)
  }
  const code = Number(res.data.code)
  if (code === 800) {
    tools.storage.removeToken()
    Message.error(res.data.message)
    router.push('/login')
  }
  return res
})
export default request
